import XLSX, {writeFile} from "xlsx";
import dayjs from 'dayjs';

/*
getDataToXlsxFile：根据数组导出文件
tableRef-表格的ref值
ignoreList-忽略导出列，例如['操作','产品操作']，表示操作、产品操作这一列不导出
tableData-表格数据
tableName-导出的文件名
colsList-表格列宽，没有就按默认列宽导出，例如：[{ wch: 5 },{ wch: 5 },...]
mergesList-合并规则,例如[[e:{r:4,c:0},s:{r:3,c:0}],...]，表示第1列的第4个格子向第1列的第3个格子合并
sortList-排序规则,有些表格是右侧固定，导出时又需要排在前面。填写规则:[{"location:"定位字段1",field:"排序字段1"，fieldEn:"排序字段属性名1"}...]
*/
export function getDataToXlsxFile(tableRef, ignoreList, tableDataCopy, tableName, colsList = [], mergesList = [], sortList = []) {

    let tableData = JSON.parse(JSON.stringify(tableDataCopy))

    let enHeader = [];//英文表头
    let zhHeader = [];//中文表头
    tableRef.columns.map((column) => {
        if (column.label && !ignoreList.includes(column.label)) {
            enHeader.push(column.prop)
            zhHeader.push(column.label)
        }
    })
    if (sortList.length > 0) {
        sortList.map((data) => {
            for (let index2 = 0; index2 < zhHeader.length; index2++) {
                //
                if (zhHeader[index2] === data.location) {
                    //
                    zhHeader.splice(index2, 0, data.field)
                    enHeader.splice(index2, 0, data.fieldEn)
                    index2++
                }
                else if (zhHeader[index2] === data.field) {
                    zhHeader.splice(index2, 1)
                    enHeader.splice(index2, 1)
                }
            }
        })
    }
    if (colsList.length === 0) {
        zhHeader.map((label) => {
            colsList.push({ wch: label.length * 2 })
        })
    }
    //定义xlsx的表头，是表格的第一行即中文表头
    let xlsxList = [zhHeader];
    //循环表格数据，将每一行表格数据添加到xlsxList中
    tableData.map((item, index0) => {
        xlsxList[index0 + 1] = [];
        //按照每行数据都按照定义的英文表头排序
        for (let index1 = 0; index1 < enHeader.length; index1++) {

            xlsxList[index0 + 1].push(item[enHeader[index1]]);
        }
    });

    //清空被合并项的数值，避免用户操作下载的excel时，修改合并项后，被合并项还保留原值
    if (mergesList.length > 0) {
        mergesList.map((mergesItem) => {

            for (let ri = mergesItem.s.r; ri < mergesItem.e.r + 1; ri++) {

                for (let ci = ri === mergesItem.s.r ? mergesItem.s.c + 1 : mergesItem.s.c; ci < mergesItem.e.c + 1; ci++) {

                    xlsxList[ri][ci] = undefined
                }
            }
        })
    }
    var wb = XLSX.utils.book_new(); //创建一个空的工作簿
    wb.SheetNames.push(tableName); //加入第一个工作表
    wb.Sheets[tableName] = XLSX.utils.aoa_to_sheet(xlsxList); //给第一个工作表赋值
    wb.Sheets[tableName]["!cols"] = colsList
    wb.Sheets[tableName]["!merges"] = mergesList;
    writeFile(wb, tableName + "-" + Date.now() + ".xlsx")
}



export function importAdd(list,col) {
    let columns = JSON.parse(JSON.stringify(col))
    // 处理上传时excel中特殊字段
    // 如：性别：男/女 不能以文字形式上传，此方法时将数据转为对应的值
    list.forEach((item) => {
        columns.forEach((i) => {
            item[i.key] = item[i.title]
            delete item[i.title]
        })
        // 处理时间，在使用FileReader解析后的时间可能是这样的 44877.4284259259 就需要专为时间戳或者时间格式
        for (let key in item) {
            if (key == "JFDate") {
                // ExcelDateToJSDate(item[key]).getTime() // 返回时间戳 1668182400000 毫秒
                // ExcelDateToJSDate(item[key]) 返回时间格式 Sat Nov 12 2022 10:17:39 GMT+0800 (中国标准时间) {}
                // 注意：这个方法在转换的时间存在误差，误差在一分钟之内
                item[key] =  ExcelDateToJSDate(item[key])
                //时间格式化 YYYY-DD-MM
                item[key] = dayjs(item[key]).format('YYYY-MM-DD');
            }
        }
    })
    list = convertImportData(list,columns)
}

export function ExcelDateToJSDate(serial) {
    var utc_days = Math.floor(serial - 25569);
    var utc_value = utc_days * 86400;
    var date_info = new Date(utc_value * 1000);
    var fractional_day = serial - Math.floor(serial) + 0.0000001;
    var total_seconds = Math.floor(86400 * fractional_day);
    var seconds = total_seconds % 60;
    total_seconds -= seconds;
    var hours = Math.floor(total_seconds / (60 * 60));
    var minutes = Math.floor(total_seconds / 60) % 60;
    return new Date(date_info.getFullYear(), date_info.getMonth(), date_info.getDate(), hours, minutes, seconds);
}

export function convertImportData(list,columns) {

    list.forEach((item) => {
        columns.forEach((i) => {
            for (let key in i) {

                if (item[i.key] == i[key]) {
                    item[i.key] = key
                }
            }
        })
        // for (let key in item) {
        //     if (!item[key] && item[key] == undefined) {
        //         item[key] = ""
        //     }
        // }
    });
    return list
}

// 处理特殊表格字段展示
export function fieldChange(row, option = { '1': '男', '2': '女' }) {
    if (option[row]) {
        return option[row]
    }
}
